// axios的二次封装
import store from '@/store'
import axios from 'axios'
import { Message } from 'element-ui'
import router from '@/router'
// 配置寄出地址
// 配置接口超时
console.log(process.env)
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 所有接口都需要
  timeout: 5000
})
const tokenTime = 3600 // token有效时长

// 封装一个判断时间过期的函数
function isCheckoutTime() {
  const time2 = Date.now() // 请求时间戳
  const timeStampt = (time2 - store.getters.hrsaasTime) / 1000 // 当前时间与登录时间的时间间隔
  return timeStampt > tokenTime // 返回的是布尔值
}

// 请求拦截器
// 可以加载私货，在请求配置对象中加一些字段
service.interceptors.request.use(config => {
  // config.headers.wang = '111'
  // 处于登录状态时，就将authorization字段注入进去
  if (store.getters.token) {
    if (isCheckoutTime()) {
      // 清除token和用户信息
      store.dispatch('user/logout')
      router.push('/login')
      return Promise.reject(new Error('token超时，重新登录')) // 他会进入响应拦截器的error回调
    }
    config.headers.Authorization = `Bearer ${store.getters.token}`
  }
  return config //! 必须返回
}, error => {
  return Promise.reject(error)
})

// 响应拦截器
// 作用：统一处理后端返回的数据
service.interceptors.response.use(response => {
  // 代表成功调取接口，但不代表业务逻辑正常，需要借助success字段校验
  // axios 自动包一层 data
  const { data, message, success } = response.data
  // console.log(response.data)
  if (success) {
    return data // 成功就返回token
  } else {
    // 业务逻辑不正常。属于报错
    Message.error(message) // 弹出错误提示
    return Promise.reject(new Error(message)) // 失败就抛出错误,外边接口调用，好catch
  }
}, error => {
  console.dir(error)
  // console.log(error.response)
  if (error && error.response && error.response.status === 401) {
    // token失效
    store.dispatch('user/logout')
    router.push('/login')
    Message.error(error.response.data.message || 'token超时，请重新登录')
  } else {
    // 业务逻辑不正常，属于报错
    Message.error(error.message || '后端服务器出错')
  }
  return Promise.reject(error)
})

export default service
